package ar.com.duam.porky.movil;

import static ar.com.duam.porky.movil.ConstantesPorky.DATE_PATTERN;
import static ar.com.duam.porky.movil.ConstantesPorky.ENCODING_ISO_8859_1;
import static ar.com.duam.porky.movil.ConstantesPorky.ENCODING_UTF_8;
import static ar.com.duam.porky.movil.ConstantesPorky.URL_PORKY;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.List;
import java.util.concurrent.ExecutionException;

import org.apache.http.HttpStatus;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import ar.com.duam.porky.movil.tasks.DownloadConceptosTask;
import ar.com.duam.porky.movil.tasks.SubirMovimientosTask;
import ar.com.duam.porky.movil.tasks.WebServiceAvailableTask;

public class Syncro 
{

	public boolean isNetworkAvailable(Context context) 
	{
	    ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
	    NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
	    
	    return activeNetworkInfo != null;
	}
	
	public boolean isWebServiceAvailable() throws InterruptedException, ExecutionException
	{
		WebServiceAvailableTask task = new WebServiceAvailableTask();
		task.execute();
		
		return task.get();
	}
	
	public Boolean subirMovimientos(Context contexto, Usuario usuario) throws PorkyException, InterruptedException, ExecutionException
	{
		if (!isNetworkAvailable(contexto))
		{
			throw new PorkyException("Debe estar conectado a Internet");
		}
		
		if (!isWebServiceAvailable())
		{
			throw new PorkyException("El sitio de Porky no responde");
		}
		
		PorkyOpenHelper helper = new PorkyOpenHelper(contexto);
		
		try 
		{
			List<Movimiento> movimientos = helper.getAllMovimientos(usuario);
			Log.d("subir_movimientos", "Se van a subir "+ movimientos.size() +" movimientos.");
			
			for (Movimiento movimiento : movimientos)
			{
				Log.d("subir_movimientos", "Subiendo el movimiento ["+ movimiento.toString() +"]");
				
				if(this.subirMovimiento(movimiento))
				{
					helper.borrarMovimiento(movimiento);
				}
				else
				{
					return false; 
				}
			}
		} 
		catch (ParseException e) 
		{
			Log.e("subir_movimientos", e.getMessage(), e);
			return false;
		}
		
		return true;
	}
	
	public Boolean subirMovimiento(Movimiento movimiento) throws InterruptedException, ExecutionException
	{
		SubirMovimientosTask task = new SubirMovimientosTask();
		task.execute(movimiento);
		
		return task.get();
	}
	
}
